//package com.nb.dp.strategy.v2;
//
//import com.nb.dp.strategy.v1.PayStrategy;
//import org.apache.catalina.core.ApplicationContext;
//import org.springframework.aop.support.AopUtils;
//import org.springframework.beans.BeansException;
//import org.springframework.beans.factory.InitializingBean;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.ApplicationContextAware;
//import org.springframework.stereotype.Component;
//import org.springframework.context.ApplicationContext;
//
//import java.util.Map;
//
///**
// *  InitializingBean 是 Spring 中的一个接口，它只包含一个方法 afterPropertiesSet()。
// *  当 Bean 的所有属性都被 Spring 容器初始化后，会调用此方法。
// * 这个接口的主要作用是在 Bean 的所有属性被初始化后执行一些后置处理工作。
// * 比如，你可以在 afterPropertiesSet() 方法中检查 Bean 的状态，或者执行一些初始化逻辑。
// *
// * 下面是一个 InitializingBean 的例子：
// * AliPayStrategyV2已经写了@Service，已经初始化了Bean
// * 这里再往payStrategyMap，其实是重复了
// * @author lihaoyang6
// * @date 2023年11月30日 17:39
// */
//@Component
//public class PayFactory implements InitializingBean { //实现ApplicationContextAware接口也可以
//
//
//    @Autowired
//    private  ApplicationContext applicationContext;
//
//    public PayFactory(ApplicationContext applicationContext){
//        this.applicationContext = applicationContext;
//    }
//
//    @Autowired
//    private Map<String, PayStrategy> payStrategyMap;
//
//
//    @Override
//    public void afterPropertiesSet() throws Exception {
//        Map<String, PayStrategy> beansOfType = applicationContext.getBeansOfType(PayStrategy.class);
//        for (PayStrategy value : beansOfType.values()) {
//            Class<?> targetClass = AopUtils.getTargetClass(value);
//            PayType annotation = targetClass.getAnnotation(PayType.class);
//            if (annotation != null) {
//                payStrategyMap.put(annotation.value(), value);
//            }
//        }
//        System.out.println("xxxxxxxxxxxxx");
//
//    }
//
//
//
//    public PayStrategy getPayStrategy(String payType){
//        PayStrategy payStrategy = payStrategyMap.get(payType);
//        if(payStrategy == null) {throw new NullPointerException("未找到类型为【"+payType+"】的支付方式实现类");}
//        return payStrategy;
//    }
//
//
//
//}
